<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //使用立即函数
        var Observe =(function(){
            var message = {}
            return {
                //注册订阅信息模块
                register:function(type,fn){
                    //检测有没有这个类型的消息队列
                    //不存在就创建一个该消息类型
                    if (typeof message[type] === 'undefined'){
                        message[type] = [fn]
                    }else{
                        message[type].push(fn)
                    }
                },
                //发布订阅信息模块
                fire:function(type,fn){
                    //判断是否有，就遍历，没有就返回
                    if (!message[type]) return
                    //要发布消息就要有发布信息对象，其中包括消息类型和携带消息
                    event = {
                        type:type,
                        fn:fn
                    }
                    //这里是指消息对应的动作序列的长度，不是message.length
                    for(let i = 0;i<message[type].length;i++){
                      message[type][i].call(this,event)
                    }
                },
                //取消订阅信息模块
                remove:function(type,fn){
                    //需要判断消息队列和动作
                    //判断是否是消息队列，也就是数组，好比二维数组
                    if(message[type] instanceof Array){
                        //从最后一个消息进行遍历
                        for(let i = message[type].length;i>=0;i--){
                            //如果存在该动作！！！！
                            if(message[type][i] === fn){
                                //splice,从i动作开始，删除一个
                                message[type][i].splice(i,1)
                            }
                        }
                    }
                }
            }
        })()


    </script>
</body>
</html>